package com.czk.scala.chapter05

/**
 * @Author:ChenZhangKun
 * @Date: 2021/12/24 17:46
 */
object Test09_CloseureAndCurrying {
  def main(args: Array[String]): Unit = {
    def add(a: Int, b: Int): Int = {
      a + b
    }

    println(add(1, 2))

    // 考虑固定一个加数的场景
    def addByFour(b: Int): Int = {
      4 + b
    }

    // 扩展固定加数改变的情况
    def addByFive(b: Int): Int = {
      5 + b
    }

    // 将固定加数作为一个参数传入，但是作为第一层参数传入
    def addByFour1(): Int => Int = {
      val a = 4

      def addB(b: Int): Int = {
        a + b
      }
      // 返回函数
      addB
    }

    // 将外层函数作为参数
    def addByFour2(a: Int): Int => Int = {
      def addB(b: Int): Int = {
        // 需要使用外层函数对象，需要闭包处理
        a + b
      }
      // 返回函数
      addB
    }

    println(addByFour2(5)(6))

    println(addByFour1()(4))

    // lambda表达式 参数表示出现一次可以用_替代
    def addByA(a: Int): Int => Int = a + _

    println(addByA(4)(5))

    // 函数的柯里化
    def addCurrying(a: Int)(b: Int): Int = {
      a + b
    }

    println(addCurrying(4)(6))
  }
}
